package model.proxy
{
	import model.AnneeEtude;
	import model.AnneeUniversitaire;
	import model.Formation;
	import model.Matiere;
	import model.Service;
	import model.Utilisateur;
	
	import mx.rpc.events.FaultEvent;
	import mx.rpc.events.ResultEvent;
	import mx.rpc.remoting.mxml.RemoteObject;
	
	import org.puremvc.as3.interfaces.IProxy;
	import org.puremvc.as3.patterns.proxy.Proxy; 
	
	public class ServiceProxy extends Proxy implements IProxy 
	{ 
		
		public static const NAME : String = 'ServiceProxy';		
		public static const LISTE_ANNEES_UNIVERSITAIRE_SERVICE_OBTENUE : String = "ListeAnneesUniversitaireServiceObtenue";
		public static const LISTE_ANNEES_ETUDE_SERVICE_OBTENUE : String = "ListeAnneesEtudeServiceObtenue";
		public static const LISTE_ENSEIGNEMENTS_SERVICE_OBTENUE : String = "ListeEnseignementsServiceObtenue";
		public static const LISTE_ENSEIGNANTS_SERVICE_OBTENUE : String = "ListeEnseignantsServiceObtenue";
		public static const LISTE_SERVICES_OBTENUE : String = "ListeServicesObtenue";
		private var remoteObjectAnneeUniversitaire : RemoteObject = null;
		private var remoteObjectAnneeEtude : RemoteObject = null;
		private var remoteObjectEnseignement : RemoteObject = null;
		private var remoteObjectEnseignant : RemoteObject = null;
		private var remoteObjectService : RemoteObject = null;
		
		/** 
		 * Constructor 
		 * We create the table logins and insert a login by default to test 
		 */ 
		public function ServiceProxy(data:Object=null) 
		{ 
			super(NAME, data);
			
			remoteObjectAnneeUniversitaire = new RemoteObject();
			remoteObjectAnneeUniversitaire.destination = "RemoteServiceAnneeUniversitaire";
			remoteObjectAnneeUniversitaire.source = "RemoteServiceAnneeUniversitaire";
			remoteObjectAnneeUniversitaire.endpoint = ApplicationFacade.SERVEUR;
			
			remoteObjectAnneeEtude = new RemoteObject();
			remoteObjectAnneeEtude.destination = "RemoteServiceAnneeEtude";
			remoteObjectAnneeEtude.source = "RemoteServiceAnneeEtude";
			remoteObjectAnneeEtude.endpoint = ApplicationFacade.SERVEUR;
			
			remoteObjectEnseignement = new RemoteObject();
			remoteObjectEnseignement.destination = "RemoteServiceEnseignement";
			remoteObjectEnseignement.source = "RemoteServiceEnseignement";
			remoteObjectEnseignement.endpoint = ApplicationFacade.SERVEUR;
			
			remoteObjectEnseignant = new RemoteObject();
			remoteObjectEnseignant.destination = "RemoteServiceEnseignant";
			remoteObjectEnseignant.source = "RemoteServiceEnseignant";
			remoteObjectEnseignant.endpoint = ApplicationFacade.SERVEUR;
			
			remoteObjectService = new RemoteObject();
			remoteObjectService.destination = "RemoteServiceService";
			remoteObjectService.source = "RemoteServiceService";
			remoteObjectService.endpoint = ApplicationFacade.SERVEUR;
		} 
 	
 		public function obtenirListeAnneesUniversitaire() : void 
 		{
 			remoteObjectAnneeUniversitaire.addEventListener(ResultEvent.RESULT, listeAnneesUniversitaireObtenue);
			remoteObjectAnneeUniversitaire.addEventListener(FaultEvent.FAULT, onFault);
 			remoteObjectAnneeUniversitaire.obtenirListeAnneesUniversitaire();
 		}
 		
 		 public function obtenirListeEnseignements(anneeEtude : AnneeEtude, matiere : Matiere) : void 
 		{
 			remoteObjectEnseignement.addEventListener(ResultEvent.RESULT, listeEnseignementsObtenue);
			remoteObjectEnseignement.addEventListener(FaultEvent.FAULT, onFault);
 			remoteObjectEnseignement.obtenirListeEnseignementsMatiere(anneeEtude, matiere);
 		}
 		
 		 public function obtenirListeAnneesEtude(anneeUniversitaire : AnneeUniversitaire) : void 
 		{
 			var utilisateur:Utilisateur = LoginProxy.user;
 			remoteObjectAnneeEtude.addEventListener(ResultEvent.RESULT, listeAnneesEtudeObtenue);
			remoteObjectAnneeEtude.addEventListener(FaultEvent.FAULT, onFault);
 			remoteObjectAnneeEtude.obtenirListeAnneesEtudeUser(utilisateur, anneeUniversitaire);
 		}

 		 public function obtenirListeEnseignants(anneeUniversitaire : AnneeUniversitaire, formation : Formation) : void 
 		{
 			remoteObjectEnseignant.addEventListener(ResultEvent.RESULT, listeEnseignantsObtenue);
			remoteObjectEnseignant.addEventListener(FaultEvent.FAULT, onFault);
 			remoteObjectEnseignant.obtenirListeEnseignants(anneeUniversitaire, formation);
 		}
 		
 		public function obtenirListeServices(anneeEtude : AnneeEtude) : void 
 		{
 			remoteObjectService.addEventListener(ResultEvent.RESULT, listeServicesObtenue);
			remoteObjectService.addEventListener(FaultEvent.FAULT, onFault);
 			remoteObjectService.obtenirListeServicesAnnee(anneeEtude);
 		}
 		
 		public function validerAjoutService(service: Service, anneeEtude : AnneeEtude) : void 
 		{
 			remoteObjectService.addEventListener(ResultEvent.RESULT, listeServicesObtenue);
			remoteObjectService.addEventListener(FaultEvent.FAULT, onFault);
 			remoteObjectService.ajouterService(service, anneeEtude);
 		}
 		
 		 public function validerModifService(service: Service, anneeEtude : AnneeEtude) : void 
 		{
 			remoteObjectService.addEventListener(ResultEvent.RESULT, listeServicesObtenue);
			remoteObjectService.addEventListener(FaultEvent.FAULT, onFault);
 			remoteObjectService.modifierService(service, anneeEtude);
 		}
 		
 		 public function supprimerService(service: Service, anneeEtude : AnneeEtude) : void 
 		{
 			remoteObjectService.addEventListener(ResultEvent.RESULT, listeServicesObtenue);
			remoteObjectService.addEventListener(FaultEvent.FAULT, onFault);
 			remoteObjectService.supprimerService(service, anneeEtude);
 		}
 		
		private function listeAnneesUniversitaireObtenue(event:ResultEvent):void
		{
			remoteObjectAnneeUniversitaire.removeEventListener(ResultEvent.RESULT, listeAnneesUniversitaireObtenue);
			var listeAnneesUniversitaire:Array = (event.result as Array)
			sendNotification(LISTE_ANNEES_UNIVERSITAIRE_SERVICE_OBTENUE, listeAnneesUniversitaire);
		}
		
		private function listeAnneesEtudeObtenue(event:ResultEvent):void
		{
			remoteObjectAnneeEtude.removeEventListener(ResultEvent.RESULT, listeAnneesEtudeObtenue);
			var listeAnneesEtude:Array = (event.result as Array)
			sendNotification(LISTE_ANNEES_ETUDE_SERVICE_OBTENUE, listeAnneesEtude);
		}
		
		private function listeEnseignementsObtenue(event:ResultEvent):void
		{
			remoteObjectEnseignement.removeEventListener(ResultEvent.RESULT, listeEnseignementsObtenue);
			var listeEnseignements:Array = (event.result as Array)
			sendNotification(LISTE_ENSEIGNEMENTS_SERVICE_OBTENUE, listeEnseignements);
		}
		
		private function listeEnseignantsObtenue(event:ResultEvent):void
		{
			remoteObjectEnseignant.removeEventListener(ResultEvent.RESULT, listeEnseignantsObtenue);
			var listeEnseignants:Array = (event.result as Array)
			sendNotification(LISTE_ENSEIGNANTS_SERVICE_OBTENUE, listeEnseignants);
		}
		
		private function listeServicesObtenue(event:ResultEvent):void
		{
			remoteObjectService.removeEventListener(ResultEvent.RESULT, listeServicesObtenue);
			var listeServices:Array = (event.result as Array)
			sendNotification(LISTE_SERVICES_OBTENUE, listeServices);
		}

		private function onFault(event:FaultEvent):void
		{
			trace("Fault");			
		}
		
		
	}
}